//
// Created by Administrator on 2025/5/7.
//

#ifndef MINIIPC_MLINK_H
#define MINIIPC_MLINK_H

typedef struct {
    char url[256]; //url
    void * callbackfun; //回调函数
}data;//数据域的结构类型
typedef struct link {//单链表的数据结构
    data Ldata;
    struct link* next;
}LNode;


//初始化一个链表（建立头节点）
LNode* List_init(void);
//判断一个单链表是否为空表
int ListEmpty(LNode* L);
//头节点也释放
//销毁单链表
int DestoryList_L(LNode* L);
//只释放后面的
//清空一个单链表
int ClearList(LNode* L);

//获取某个节点的数据区，通过data接收
int GetElem_L(LNode* L, int i, data* data);

//返回链表的长度.i=0,则不算头节点，i=1，则算头节点
int ListLength(LNode* L);
//在单链表中按照数据域中的某个值来查找响应节点，返回对应节点的地址
LNode* LocateElem_L_P(LNode* L, int nam);
//在单链表中按照第几个节点来查找响应节点，返回对应节点的地址
LNode* LocateElem_LN_P(LNode* L, int n);

//在单链表中按照数据域中的某个值来查找响应节点，返回对应节点的序号
int LocateElem_L_N(LNode* L, int nam);

/**
  * @brief 在第i个节点之前插入一个新节点
  *       （注意引用&是c++中的语法，在C语言中要以指针替换）
  * @param  i: 表示第几个节点
  * @param  dat: 用dat来存储增加节点数据域的数据
  * @retval 0 错误 1成功
  */
int ListInsert_L(LNode* L, int i, data dat);

/**
  * @brief 将链表中第i个元素删除
  *       （注意引用&是c++中的语法，在C语言中要以指针替换）
  * @param  i: 表示删除第几个元素
  * @param  dat: 用dat来存储被删除数据的数据域
  * @retval 0 错误 1成功
  */
int ListDelete_L(LNode* L, int i, data* dat);

/**
  * @brief 用头插法来建立一个链表,这里我做了一些修改
  *        原版是在函数内部给 L分配空间，这里我并没有这样做
  *        因此在使用该函数之前必须要调用List_init（）来为L分配空间
  *       （注意引用&是c++中的语法，在C语言中要以指针替换）
  * @param  L: LNode*  pp 定义的一个指针，指向头节点
  * @param  dat: data 类型的数据域结构体，用于给新建节点的数据域赋值
  * @retval 0 错误 1成功
  */
int CreateList_H(LNode* L, data* dat);


/**
  * @brief 用尾插法来建立一个链表,
  *        原版是在函数内部给 L分配空间，这里我并没有这样做
  *        因此在使用该函数之前必须要调用List_init（）来为L分配空间
  *       （注意引用&是c++中的语法，在C语言中要以指针替换）
  * @param  L: LNode*  pp 定义的一个指针，指向头节点
  * @param  dat: data 类型的数据域结构体，用于给新建节点的数据域赋值
  * @retval 0 错误 1成功
  */
int CreateList_R(LNode* L, data* dat);


//遍历链表.并调用其数据中的init方法 。i=0,则不算头节点，i=1，则算头节点
int Traverselist_runInit(LNode* L);

//遍历链表.并调用其数据中的outList_run方法 。i=0,则不算头节点，i=1，则算头节点
int Traverselist_outList_run(LNode* L);
//
////遍历链表.并调用其数据中的create_tree方法 。i=0,则不算头节点，i=1，则算头节点
//int Traverselist_create_tree(LNode* L);
#endif //MINIIPC_MLINK_H
